解题思路

  1. 反转整个字符串
  2. 找到单个单词
  3. 反转单个单词
  4. 清除末尾空格

注意事项
反转字符串后,最开始有可能为空格,因此需要检测空格
找到单个单词并移动,使用idx表示新字符串存放位置
反转单词时位置关系,应使用idx表示,start和end不能准确表达
修改完单词后添加空格,这里应在单词前添加,防止清除不干净

代码

class Solution {
public:
    string reverseWords(string s) {
    // 反转整个字符串
    reverse(s.begin(),s.end());

    int n = s.size();
    int idx = 0; // 记录修改的位置
    for(int start = 0; start<n; ++start) {

        // 找到不是空格的位置
        if(s[start]!=' '){

            // 在非第一个单词前补' '
            if(idx!=0) s[idx++] = ' ';
            
            int end = start; // 初始化end

            // 找到不是空格的位置
            while(end<n&&s[end]!=' ') {
                s[idx++] = s[end++]; // 原字符串修改
            }

            // 反转单词 用idx标记,因为发生了字符串挪动
            reverse(s.begin()+idx-(end-start),s.begin()+idx);
            //reverse(s.begin()+start,s.begin()+end);

            // 更新start
            start = end;
            
        }
    }
    // 清除最后的空格
    s.erase(s.begin()+idx,s.end());
    return s;

    }
};